# _*_ coding: utf-8 _*_
# @创建时间：2024/3/7 10:49
# @作者：dengqihua
# @名称 : schedule.py
# @描述 :  定时任务

from apscheduler.executors.asyncio import AsyncIOExecutor
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.jobstores.redis import RedisJobStore
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.interval import IntervalTrigger

from app.config.setting import settings
from app.libs.logger import aio_logger

# 创建定时任务实例
scheduler = AsyncIOScheduler()


async def scheduler_init():
    scheduler.configure(
        # 配置存储器
        jobstores={
            'default': RedisJobStore(**{
                'host': settings.redis_host,
                'port': settings.redis_port,
                'db': settings.redis_db,
                'password': settings.redis_password
            })
        },
        # 配置执行器
        executors={
            'default': AsyncIOExecutor(),
            'threadpool': ThreadPoolExecutor(max_workers=20)
        },
        # 配置创建job时的默认参数
        job_defaults={
            'coalesce': True,  # 是否合并执行
            'max_instances': 1  # 最大实例数
        }
    )

    # # 每天0点35分执行邀请码数据统计
    # scheduler.add_job(func=InviteCodeDataStatJob.run, id='invite_code_data_stat_job', trigger=CronTrigger(hour=0, minute=35), replace_existing=True)
    #
    # # 每隔两小时执行一次，刷新微信公众号access_token（正式环境才执行）
    # scheduler.add_job(func=WeixinAccessTokenJob.run, id='weixin_access_token_job', trigger=IntervalTrigger(hours=2), replace_existing=True)

    scheduler.start()
    await aio_logger.info(f'初始化定时任务成功!')
